package my.example;


import java.util.ArrayList;
import java.util.List;

import org.junit.Assert;
import org.junit.FixMethodOrder;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.util.MultiValueMap;

import com.fasterxml.jackson.databind.node.ObjectNode;

/**
  *默认按原有顺序的，自行按需调整顺序，比如查询详情、编辑肯定得数据存在
  */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class my.example.ZlTestController2Test extends BaseApplicationTest {

    @Order(1)
    @ParameterizedTest
    @MethodSource("test1OfReq")//用方法更清晰
    void test1(String reqstr) throws Exception {
        ObjectNode jsonObj = JsonUtil.parseObject(reqstr);
        //JSON请求
        String url="/testb/test1";
        MvcResult mvcResult=mockMvc.perform(setLoginUserInfo(MockMvcRequestBuilders
             .post(url)
             .contentType(MediaType.APPLICATION_JSON)
             .content(reqstr)))
             .andExpect(MockMvcResultMatchers.status().isOk())
             .andReturn();
             
             //如果不是JSON的自行修改
             R<Object> res=JsonUtil.json2Bean(mvcResult.getResponse().getContentAsString(),R.class);
             Assert.assertEquals(R.SUCCESS,res.getCode());
    }
    //这样写便于兼容读文件或字符串两种方式
    static List<String> test1OfReq() {
        //测试集，里面已有几条数据就是几次请求，便于测试不同分支情况
        List<String> reqList=new ArrayList<>();
        
        List<String> txts = readFileData("test1OfReq.json");
        if(txts != null) {
            for(String x:txts) {
                //可以从日志或数据库获取修改
                reqList.add(setUserReqData(JsonUtils.parseObject(x)));
            }
        }
        return reqList;
    }
    
    @Order(2)
    @ParameterizedTest
    @MethodSource("test2OfReq")//用方法更清晰
    void test2(String reqstr) throws Exception {
        ObjectNode jsonObj = JsonUtil.parseObject(reqstr);
        //普通请求
        MultiValueMap<String, String> paramMap=setParam(jsonObj);
        String url="/testb/test2";
        MvcResult mvcResult=mockMvc.perform(setLoginUserInfo(MockMvcRequestBuilders
             .post(url)
             .params(paramMap)))
             .andExpect(MockMvcResultMatchers.status().isOk())
             .andReturn();
             
             //如果不是JSON的自行修改
             R<Object> res=JsonUtil.json2Bean(mvcResult.getResponse().getContentAsString(),R.class);
             Assert.assertEquals(R.SUCCESS,res.getCode());
    }
    //这样写便于兼容读文件或字符串两种方式
    static List<String> test2OfReq() {
        //测试集，里面已有几条数据就是几次请求，便于测试不同分支情况
        List<String> reqList=new ArrayList<>();
        
        List<String> txts = readFileData("test2OfReq.json");
        if(txts != null) {
            for(String x:txts) {
                //可以从日志或数据库获取修改
                reqList.add(setUserReqData(JsonUtils.parseObject(x)));
            }
        }
        return reqList;
    }
    
    @Order(3)
    @ParameterizedTest
    @MethodSource("test3OfReq")//用方法更清晰
    void test3(String reqstr) throws Exception {
        ObjectNode jsonObj = JsonUtil.parseObject(reqstr);
        //JSON请求
        String url="/testb/test3";
        MvcResult mvcResult=mockMvc.perform(setLoginUserInfo(MockMvcRequestBuilders
             .post(url)
             .contentType(MediaType.APPLICATION_JSON)
             .content(reqstr)))
             .andExpect(MockMvcResultMatchers.status().isOk())
             .andReturn();
             
             //如果不是JSON的自行修改
             R<Object> res=JsonUtil.json2Bean(mvcResult.getResponse().getContentAsString(),R.class);
             Assert.assertEquals(R.SUCCESS,res.getCode());
    }
    //这样写便于兼容读文件或字符串两种方式
    static List<String> test3OfReq() {
        //测试集，里面已有几条数据就是几次请求，便于测试不同分支情况
        List<String> reqList=new ArrayList<>();
        
        List<String> txts = readFileData("test3OfReq.json");
        if(txts != null) {
            for(String x:txts) {
                //可以从日志或数据库获取修改
                reqList.add(setUserReqData(JsonUtils.parseObject(x)));
            }
        }
        return reqList;
    }
    
    @Order(4)
    @ParameterizedTest
    @MethodSource("test4OfReq")//用方法更清晰
    void test4(String reqstr) throws Exception {
        ObjectNode jsonObj = JsonUtil.parseObject(reqstr);
        //JSON请求
        String url="/testb/test4";
        MvcResult mvcResult=mockMvc.perform(setLoginUserInfo(MockMvcRequestBuilders
             .post(url)
             .contentType(MediaType.APPLICATION_JSON)
             .content(reqstr)))
             .andExpect(MockMvcResultMatchers.status().isOk())
             .andReturn();
             
             //如果不是JSON的自行修改
             R<Object> res=JsonUtil.json2Bean(mvcResult.getResponse().getContentAsString(),R.class);
             Assert.assertEquals(R.SUCCESS,res.getCode());
    }
    //这样写便于兼容读文件或字符串两种方式
    static List<String> test4OfReq() {
        //测试集，里面已有几条数据就是几次请求，便于测试不同分支情况
        List<String> reqList=new ArrayList<>();
        
        List<String> txts = readFileData("test4OfReq.json");
        if(txts != null) {
            for(String x:txts) {
                //可以从日志或数据库获取修改
                reqList.add(setUserReqData(JsonUtils.parseObject(x)));
            }
        }
        return reqList;
    }
    
}

